#pragma once
/**
 * @file LoopThread.hpp
 * @author 1102403684@qq.com
 * @brief  将EventLoop 和一个线程 整合在一起
 * @version 0.1
 * @date 2024-10-16
 * 
 * @copyright Copyright (c) 2024
 * 
 */

#include <thread>
#include "EventLoop.hpp"
#include <mutex>
#include <condition_variable>

class LoopThread
{
public: 
    LoopThread(): loop_(nullptr) , thread_(std::thread(&LoopThread::entry_thread, this))
    {

    }

    EventLoop* get_loop(){
        {
            std::unique_lock<std::mutex> lock(mutex_);
            cond_.wait(lock, [&]{
                return loop_ != nullptr;
            });
        }

        return loop_;
    }

private:

    //实例化EventLoop 并开始运行EventLoop模块的功能 start
    void entry_thread()
    {
        EventLoop loop; //在局部创建 目的是为了让loop的生命周期随线程，而不是new
        {
            std::unique_lock<std::mutex> lock(mutex_);
            loop_ = &loop;
            cond_.notify_all(); //唤醒可能阻塞的线程
        }

        loop.start(); 
    }
private:
    std::thread thread_; //EventLoop的线程
    EventLoop* loop_;   //在对应的线程中创建

    //避免线程创建 但loop还没有实例化之前就getloop了 
    std::mutex mutex_;
    std::condition_variable cond_;
};